package clase_colas;

import java.io.*;

public class Colas {
    public static class ClaseColas { 		// Declaración de la clase de Colas
         static int max=10;  				// Tamaño máximo de la Cola para este ejm
         static int cola[]= new int[max];		// Declaración del arreglo unidimensional
         static int frente, fin; 				// Variables de inicio o frente y fin de la Cola
         
         ClaseColas() { 				// Constructor,inicializa frente y final de la Cola
	         frente=0;   fin=0;			// Inicializar el frente y el fin en 0
	         System.out.println("Cola inicializada !!!");
         }
         
         public static void Insertar(int dato) {
	         if(fin==max) { 			// Condicional pregunta por el estado de la cola, si está llena?
		         System.out.println("\nCola llena !!!");
		         return;
	         }
	         cola[fin++]=dato; 			// Si no está llena, llevarle el dato a insertar o a encolar
	         System.out.println("Dato insertado !!!");
         }
         
         public static void Eliminar() {
	         System.out.println("\n\n<<< ELIMINAR >>>");
	         if(frente==fin) { 			// Condicional pregunta el estado de la cola, si esta vacía?
		         System.out.println("\nCola vacia !!!");
		         return;
	         }
             System.out.println("Elemento eliminado: "+cola[frente++]);
         }
         
         public static void Mostrar() {
	         int i=0;
	         System.out.println("\n\n<<< MOSTRAR >>>");
	         if(frente==fin)  System.out.println("\nCola vacia !!!");//condicional para la cola bacia y que imprima "cola vacia"
	         for(i=frente; i<fin; i++) {					//sino esta vacia la recorre e imprime su pocision y el valor de cuya posicion
		         System.out.println("cola["+i+"]="+" "+cola[i]);
	         }
	         System.out.println("\nFrente= "+frente);		//imprime las variable frente fin y max
	         System.out.println("Final = "+fin);
	         System.out.println("Max  = "+max);
         }
    }
    
    static ClaseColas Cola=new ClaseColas(); 		// Declaración del objeto Cola
    
    // Metodo principal
    public static void main(String args[]) throws IOException {
	    int op=0;
	    do {
		         System.out.println("\n\n<<< COLAS >>>");//menu de opciones
		         System.out.println("1.  Insertar");
		         System.out.println("2.  Eliminar");
		         System.out.println("3.  Mostrar");
		         System.out.println("0.  Salir");
		         System.out.print("Opcion? ---> ");
		         op=getInt();						//lee la opcion digitada
		         
		         switch(op) {								//controla los casos de la opcion digitada
			         case 1 : Insertar();          break;		//
			         case 2 : Cola.Eliminar(); break;
			         case 3 : Cola.Mostrar();  break;
		         }
	    }while(op!=0);							//se repite cuando usuario digite una cantidad diferente de 0
    }
    

    public static void Insertar() throws IOException {		//trata la excepcion
	    int elemento=0;
	    System.out.println("\n\n<<< INSERTAR>>>");			
	    System.out.print("Elemento a insertar? ---> ");
	    elemento=getInt();				//lee el elemento a insertar
	    Cola.Insertar(elemento);		// Invocar el método Insertar del objeto Cola
    }
    
    // Función para capturar una cadena desde el teclado
     public static String getString() throws IOException {
            InputStreamReader isr = new InputStreamReader(System.in);//abre el flujo de entrada de datos
            BufferedReader br = new BufferedReader(isr);		//se crea el buffer de lectura de datos
            String s = br.readLine();//se asigna a un string todo lo copiado en el teclado hasta nueva linea
            return s;
        }    
        
        // Función para capturar un entero desde el teclado
        public static int getInt() throws IOException {//trata excepciones
            String s = getString();					//se asisgna un string	
            return Integer.parseInt(s);	//retorna el string formateado a entero
        }    
}